﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Arquitetura.UI.Helpers;
using Arquitetura.Common;
using Arquitetura.UI.WebApp.SecretariaServiceReference;

namespace Arquitetura.UI.WebApp
{
    public partial class AlunoManutencao : System.Web.UI.Page
    {
        #region Enum(s)
        public enum Operacao
        {
            Incluir,
            Alterar
        }
        #endregion Enum(s)

        #region Constant(es)
        public const string sesOperacaoKey = "AlunoManutencao__sesOperacaoKey";
        public const string sesIdAlunoParametroKey = "AlunoManutencao__sesIdAlunoParametroKey";
        private const string sesAlunoKey = "AlunoManutencao__sesAlunoKey";
        #endregion Constant(es)

        #region Atributo(s)
        private SecretariaServiceClient m_secretariaServiceClient;
        #endregion Atributo(s)

        #region Propriedade(s)
        protected Operacao? OperacaoCorrente
        {
            set
            {
                if (value != null)
                {
                    Session[sesOperacaoKey] = value;
                }
                else
                {
                    Session.Remove(sesOperacaoKey);
                }
            }
            get
            {
                return Session[sesOperacaoKey] as Operacao?;
            }
        }

        protected int? IdAlunoParametro
        {
            get
            {
                return Session[sesIdAlunoParametroKey] as int?;
            }

            set
            {
                if (value != null)
                {
                    Session[sesIdAlunoParametroKey] = value;
                }
                else
                {
                    Session.Remove(sesIdAlunoParametroKey);
                }
            }
        }

        protected Aluno Aluno
        {
            get
            {
                return Session[sesAlunoKey] as Aluno;
            }

            set
            {
                if (value != null)
                {
                    Session[sesAlunoKey] = value;
                }
                else
                {
                    Session.Remove(sesAlunoKey);
                }
            }
        }
        #endregion Propriedade(s)

        #region Evento(s)
        protected void Page_Preinit(object sender, EventArgs e)
        {
            m_secretariaServiceClient = new SecretariaServiceClient();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                switch (OperacaoCorrente)
                {
                    case Operacao.Incluir:
                        {
                            Aluno = new Aluno();
                        } break;

                    case Operacao.Alterar:
                        {
                            Aluno = new Aluno() { Id = IdAlunoParametro.Value };
                            ResultOfAluno resultado = m_secretariaServiceClient.ConsultarAluno(Aluno);
                            if (resultado.Success)
                            {
                                Aluno = resultado.Returned;
                                CarregarCampos();
                            }
                            else
                            {
                                Response.Redirect("~/AlunoListar.aspx");
                            }

                        } break;

                    default:
                        Response.Redirect("~/AlunoListar.aspx");
                        break;
                }
            }
        }

        protected void Page_Unload(object sender, EventArgs e)
        {
            ((IDisposable)m_secretariaServiceClient).Dispose();
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            CarregarEntidade();

            switch (OperacaoCorrente)
            {
                case Operacao.Incluir:
                    {
                        Result resultado = m_secretariaServiceClient.InserirAluno(Aluno);
                        if (resultado.Success)
                        {
                            Response.Redirect("~/AlunoListar.aspx");
                        }
                        else
                        {
                            resultado.ConsolidateResult(CriarListaResultadoAlvo());
                        }
                    } break;

                case Operacao.Alterar:
                    {
                        Result resultado = m_secretariaServiceClient.AlterarAluno(Aluno);
                        if (resultado.Success)
                        {
                            Response.Redirect("~/AlunoListar.aspx");
                        }
                        else
                        {
                            resultado.ConsolidateResult(CriarListaResultadoAlvo());
                        }
                    } break;

                default:
                    break;
            }
        }
        #endregion Evento(s)

        #region Método(s)
        private void CarregarEntidade()
        {
            Aluno.Nome = txtNome.Text.FormGetValue();
            Aluno.Sobrenome = txtSobrenome.Text.FormGetValue();
            Aluno.CPF = Formata.RemoveFormatoCPF(txtCPF.Text).FormGetValue();
            Aluno.RG = txtRG.Text.FormGetValue();
            Aluno.Prontuario = txtProntuario.Text.FormGetValue();

            if (OperacaoCorrente == Operacao.Incluir)
            {
                Aluno.Mae = new Mae();
                Aluno.Mae.Nome = txtNomeMae.Text.FormGetValue();
                Aluno.Mae.Sobrenome = txtSobrenomeMae.Text.FormGetValue();
                Aluno.Mae.CPF = Formata.RemoveFormatoCPF(txtCPFMae.Text).FormGetValue();
                Aluno.Mae.RG = txtRGMae.Text.FormGetValue();
            }
        }

        private void CarregarCampos()
        {
            txtNome.Text = Aluno.Nome ?? string.Empty;
            txtSobrenome.Text = Aluno.Sobrenome ?? string.Empty;
            txtCPF.Text = Formata.FormataCPF(Aluno.CPF ?? string.Empty);
            txtRG.Text = Aluno.RG ?? string.Empty;
            txtProntuario.Text = Aluno.Prontuario ?? string.Empty;
            txtNomeMae.Text = Aluno.Mae.Nome ?? string.Empty;
        }

        private ListOfValidatorResult CriarListaResultadoAlvo()
        {
            ListOfValidatorResult listOfTargetResult = new ListOfValidatorResult();
            listOfTargetResult.Add(new ValidatorResult("Aluno", "Nome", cuvNome));
            listOfTargetResult.Add(new ValidatorResult("Aluno", "Sobrenome", cuvSobrenome));
            listOfTargetResult.Add(new ValidatorResult("Aluno", "CPF", cuvCPF));
            listOfTargetResult.Add(new ValidatorResult("Aluno", "RG", cuvRG));
            listOfTargetResult.Add(new ValidatorResult("Aluno", "Prontuario", cuvProntuario));
            listOfTargetResult.Add(new ValidatorResult("Mae", "Nome", cuvNomeMae));
            listOfTargetResult.Add(new ValidatorResult("Mae", "Sobrenome", cuvSobrenomeMae));
            listOfTargetResult.Add(new ValidatorResult("Mae", "CPF", cuvCPFMae));
            listOfTargetResult.Add(new ValidatorResult("Mae", "RG", cuvRGMae));
            return listOfTargetResult;
        }
        #endregion Método(s)
    }
}